#include "device.h"

// // 用户自定义 DeviceEvent 和 ReportType 结构体
struct DeviceEvent {
    uint32_t eventModule; // 模块类型   
    uint32_t eventType;  // 事件类型
    void *eventMessage;  // 事件消息
    // 其他事件相关字段...
};

struct ReportType {
    uint32_t reportModule;  // 报告模块标识
    uint32_t reportType;    // 报告类型标识
    void *re
    // 其他报告相关字段...
};

struct SendReportType {
    uint32_t SendReportType;    // 报告类型标识
    // 其他报告相关字段...
};

// 变量申明
DeviceEvent DeviceEvent；
ReportType ReportType;
SendReportType SendReportType;

// 组件事件组和数据发送事件组
QueueHandle_t xModuleEventQueue = NULL;
QueueHandle_t xSendDataQueue = NULL;

// 设备模块实例化
DeviceModule device = {
    // TODO: 增加一个 deInit的接口 待用户实现
    .Init = Device_Init,
	.InitModuleHookFunction = NULL, // 待用户实现
	.InitUserHookFunction = NULL, // 待用户实现
    .EventLoopTask = Device_EventLoopTask,
    .ProcessEventHookFunction = NULL, // 待用户实现， 如果模块间的事件需要相互流转时，用该方法实现。
    .UserControlFlowHookFunction = NULL, // 待用户实现， 如果模块的事件需要用户控制流程来流转，用该方法实现。
    .SendDataHook = NULL, // 待用户实现
	.GetSendReportTyp = Device_GetSendReportType, // 
	.SetSendReportTyp = Device_SetSendReportType, // 
    .SetModuleState = Device_SetModuleState,
    .GetModuleState = Device_GetModuleState
	.GetSendDateReport = Device_GetSendDateReport,
	.SendDataReportType = Device_SendDataReportType, // 发送数据事件
};

// 初始化接口
void Device_Init(void) {
    // 创建事件组队列及相应的监听任务
    xModuleEventQueue = xQueueCreate(10, sizeof(DeviceEvent));
    xSendDataQueue = xQueueCreate(10, sizeof(SendReportType));
    
    // 检查队列是否创建成功
    if (xModuleEventQueue != NULL && xSendDataQueue != NULL) {
        xTaskCreate(Device_EventLoopTask, "EventLoopTask", 1024, NULL, 2, NULL);
        xTaskCreate(Device_SendDataLoopTask, "SendDataLoopTask", 1024, NULL, 2, NULL);
    }else {
        printf("Failed to create event queue and task!");
    }
    
    // 用户控制流程初始钩子
    if(device.InitModuleHookFunction != NULL){
        device.InitModuleHookFunction(&device);
    }

    if(device.InitUserHookFunction != NULL){
        device.InitUserHookFunction(&device);
    }
}

uint32_t Device_GetSendReportType(void){
    return SendReportType.SendReportType;
}

void Device_SetSendReportType(SendReportType *send_report_type){
    return SendReportType.SendReportType = *send_report_type;
}

// 事件组监听任务
void Device_EventLoopTask(void* arg) {
    // 监听事件组队列
    DeviceEvent event;
    while (1) {
        if (xQueueReceive(xModuleEventQueue, &event, portMAX_DELAY) == pdTRUE) {
            // 将监听到的事件，输入用户的控制流处理函数
            // ReportType* report = device.GetModuleState();
			if(device.ProcessEventHookFunction != NULL){
            	device.ProcessEventHookFunction(&event);
			}
			if(device.UserControlFlowHookFunction != NULL){
            	device.UserControlFlowHookFunction(&event);
			}
			if(device.Device_GetSendReportType()){
				device.SendDataReport(xSendDataQueue, device.GetSendDateReport());
			}
        }
    }
}
// 业务数据发送
void Device_SendDataReportType(QueueHandle_t xSendDataQueue, void* report_type){

	SendReportType SendReportType;
    // 发送业务数据
	// if(device.SendDataHook != NULL){
	// 	device.SendDataHook(xSendDataQueue, report_type);
	// }
	// if(device.UserControlFlowHookFunction != NULL){
	// 	device.UserControlFlowHookFunction(report_type);
	// }
	// if(device.GetSendDateReport()){
	    
	// }
    xQueueSend(xSendDataQueue, report_type, portMAX_DELAY);
}
// 业务数据发送队列监听任务
void Device_SendDataLoopTask(void* arg) {
    // 监听业务数据发送事件组队列，将业务数据发送出去
    ReportType report;
    while (1) {
        if (xQueueReceive(xSendDataQueue, &report, portMAX_DELAY) == pdTRUE) {
            // 发送业务数据
            // ...
        }
    }
}

// 设置组件运行状态
void Device_SetModuleState(void) {
    // 批量设置，组件的运行状态
    // ...
}

// 获取组件运行状态
ReportType* Device_GetModuleState(void) {
    // 批量获取，组件的运行状态
    static ReportType report;
    // ... 填充 report 信息
    return &report;
}

// 其他模块特定的函数实现...